/***************************************************************************
 *   Copyright (C) 2007 by Warren Kenny   *
 *   warren.kenny@gmail.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include <otaTCPHeader.h>

otaTCPHeader::otaTCPHeader()
{
}


otaTCPHeader::otaTCPHeader( unsigned short sourcePort,
	      unsigned short destinationPort,
	      unsigned int sequenceNumber,
	      unsigned int acknowledgementNumber,
	      unsigned char dataOffset,
	      unsigned char flags,
	      unsigned short window,
	      unsigned short checksum,
	      unsigned short urgentPointer )
:	m_sourcePort(sourcePort),
	m_destinationPort(destinationPort),
	m_sequenceNumber(sequenceNumber),
	m_acknowledgementNumber(acknowledgementNumber),
	m_dataOffset(dataOffset),
	m_flags(flags),
	m_window(window),
	m_checksum(checksum),
	m_urgentPointer(urgentPointer)
{
}
	
bool otaTCPHeader::deserialize( const char *data, const unsigned int dataSize, const unsigned int offset, unsigned int &newOffset )
{
	if( dataSize - offset >= OTA_TCP_HEADER_LENGTH )
	{
		bool ok = (	otaBytePacker::removeBasicType( data, dataSize, offset, newOffset, m_sourcePort ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_destinationPort  ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_sequenceNumber ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_acknowledgementNumber ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_dataOffset ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_flags ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_window ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_checksum ) &&
				otaBytePacker::removeBasicType( data, dataSize, newOffset, newOffset, m_urgentPointer ) );
		
		return ok;
	}
	else
	{
		std::cout << "TCP";
		return false;
	}
}
    
bool otaTCPHeader::serialize( char *data, const unsigned int dataSize, const unsigned int offset, unsigned int &newOffset )
{
	if( dataSize - offset >= OTA_TCP_HEADER_LENGTH )
	{
		bool ok = (	otaBytePacker::appendBasicType( data, dataSize, offset, newOffset, m_sourcePort ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_destinationPort ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_sequenceNumber ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_acknowledgementNumber ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_dataOffset ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_flags ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_window ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_checksum ) &&
				otaBytePacker::appendBasicType( data, dataSize, newOffset, newOffset, m_urgentPointer ) );
		
		return ok;
	}
	else
	{
		return false;
	}
}
    
unsigned short otaTCPHeader::getSourcePort()
{
	return m_sourcePort;
}
	
unsigned short otaTCPHeader::getDestinationPort()
{
	return m_destinationPort;
}


otaTCPHeader::~otaTCPHeader()
{
}


